﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace DC.Serialization.Event
{
    /*
     * 序列化参数->传递消息给服务->反序列化参数->执行操作->序列化结果->返回消息给客户端->反序列化参数
     * Client                                           Service                                 Service                                            Client
     * 
     * serializing事件发生在序列化之前。
     * serilaized事件发生在序列化之后。
     * deserializing事件发生在反序列化之前。
     * deserilaized事件发生在反序列化之后。
     * 
     * 1. 在反序列化期间，Deserializing事件的处理方法在逻辑上就是反序列化的构造函数
     * 2. 如果你希望在该事件中初始化某个类成员，那么不要使用DataMember标记该成员。
     *      因为一旦使用使DataMember标记该成员，在初始化时为该成员设置任何值都是无效的，
     *      因为WCF会在反序列化期间根据从消息获得的值对这些成员进行重新赋值。
     * 
     * 
     * 
     */
    [DataContract]
    public class Address
    {
        [DataMember]
        public string Country { get; set; }
        [DataMember]
        public string Province { get; set; }

        public string City { get; set; }
        [DataMember]
        public string Street { get; set; }

        [OnSerializing]
        void OnSerializing(StreamingContext context)
        {
            Country += " OnSerializing";
        }

        [OnSerialized]
        void OnSerialized(StreamingContext context)
        {
            Province += " OnSerialized";
        }

        [OnDeserializing]
        void OnDeserializing(StreamingContext context)
        {
            City += " OnDeserializing";
        }

        [OnDeserialized]
        void OnDeserialized(StreamingContext context)
        {
            Street += " OnDeserialized";
        }
    }

    [DataContract]
    public class Contact
    {
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string LastName { get; set; }
        [DataMember]
        public string PhoneNumber { get; set; }

        public string CarNumber { get; set; }
        [DataMember]
        public Address Address { get; set; }


        [OnSerializing]
        void OnSerializing(StreamingContext context)
        {
            FirstName += " OnSerializing";
        }

        [OnSerialized]
        void OnSerialized(StreamingContext context)
        {
            LastName += " OnSerialized";
        }

        [OnDeserializing]
        void OnDeserializing(StreamingContext context)
        {
            PhoneNumber += "OnDeserializing";
        }

        [OnDeserialized]
        void OnDeserialized(StreamingContext context)
        {
            CarNumber += " OnDeserialized";
        }
    }

    //[DataContract]
    //public class Customer : Contact
    //{
    //    public string Company { get; set; }
    //    public Contact Contact { get; set; }
    //}
    
    [ServiceContract]
    interface IServiceContract {
        [OperationContract]
        Address GetAddress(Address address);

        [OperationContract]
        Contact GetContact(Contact contact);
    }
}
